using System.Collections;
using TMPro;
using UnityEngine;

public class ChatboxGoner : MonoBehaviour
{
	public Transform TextboxObject;

	public TextMeshProUGUI TextUI;

	public TextMeshProUGUI TextBulletpointUI;

	public AudioSource TextVoiceEmitter;

	private string CurrentText = "";

	public int CurrentTextIndex;

	public int CurrentAdditionalTextIndex;

	private int StoredAfterIndex;

	public int PauseCounter;

	public CHATBOXTEXT storedchatboxtext;

	public CHATBOXTEXT previouschatboxtext;

	public bool ChatIsCurrentlyRunning;

	public bool AllowInput = true;

	private INT_Chat storedreciever;

	public Transform SoulIcon;

	public Material HighlightedMaterial;

	public Material NotHighlightedMaterial;

	public TMP_FontAsset DefaultFont;

	public AudioClip DefaultSpeakSound;

	public Sprite DefaultIcon;

	public RectTransform[] Options;

	public RectTransform HeartCursor;

	private int ChoiceNumber;

	public int PreviousChosenChoiceIndex;

	private int cursorpos;

	private bool CurrentlyInChoice;

	private bool HideChoicesUntilFinish;

	private float CurrentTextSpeedMultiplier;

	private void Start()
	{
		SoulIcon.GetComponent<Animator>().speed = 666f;
	}

	private void Update()
	{
		ProcessInput();
		SetHeartCursorPOS();
	}

	private void ProcessInput()
	{
		if (CurrentText != "" || CurrentText != null)
		{
			PauseCounter = FormatCurrentText(CurrentText, IncludeBulletPoint: true).Length;
		}
		if (CurrentlyInChoice && TextUI.maxVisibleCharacters == PauseCounter && HideChoicesUntilFinish && !HeartCursor.gameObject.activeSelf)
		{
			Options[0].gameObject.SetActive(value: true);
			Options[1].gameObject.SetActive(value: true);
			HeartCursor.gameObject.SetActive(value: true);
			SoulIcon.gameObject.SetActive(value: true);
		}
		if (Input.GetKey(KeyCode.X) || Input.GetKey(KeyCode.RightShift))
		{
			CurrentTextSpeedMultiplier = 0.33f;
		}
		else
		{
			CurrentTextSpeedMultiplier = 0.85f;
		}
		if ((Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) && CurrentlyInChoice && AllowInput && cursorpos - 1 > -1)
		{
			cursorpos--;
			SetHeartCursorPOS();
		}
		if ((Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) && CurrentlyInChoice && AllowInput && cursorpos + 1 <= ChoiceNumber - 1)
		{
			cursorpos++;
			SetHeartCursorPOS();
		}
		if ((!Input.GetKeyDown(KeyCode.Z) && !Input.GetKeyDown(KeyCode.Return)) || !CurrentlyInChoice || TextUI.maxVisibleCharacters != PauseCounter || !AllowInput)
		{
			return;
		}
		if (storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Choice[CurrentTextIndex] != null && storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Choice[CurrentTextIndex].ChoiceTextResults[cursorpos] == null)
		{
			PreviousChosenChoiceIndex = cursorpos;
			if (CurrentTextIndex + 1 != storedchatboxtext.Textboxes[StoredAfterIndex].Text.Length && storedchatboxtext != null)
			{
				CurrentlyInChoice = false;
				CurrentTextIndex++;
				RunText(storedchatboxtext, StoredAfterIndex, storedreciever, ResetCurrentTextIndex: false);
				MonoBehaviour.print("test");
			}
			else
			{
				EndText();
			}
		}
		else
		{
			PreviousChosenChoiceIndex = cursorpos;
			CurrentlyInChoice = false;
			RunText(storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Choice[CurrentTextIndex].ChoiceTextResults[cursorpos], 0, storedreciever, ResetCurrentTextIndex: true);
		}
	}

	private string FormatCurrentText(string TargetText, bool IncludeBulletPoint)
	{
		return TargetText.Replace("#", "").Replace("@", "").Replace(";", "\n")
			.Replace("~", "\n");
	}

	private void SetupChoices(CHATBOXTEXT chatbox, int index)
	{
		if (chatbox.Textboxes[index].Choice[CurrentTextIndex] != null)
		{
			CurrentlyInChoice = true;
			CHATBOXCHOICE cHATBOXCHOICE = chatbox.Textboxes[index].Choice[CurrentTextIndex];
			ChoiceNumber = cHATBOXCHOICE.Choices.Count;
			SetHeartCursorPOS();
			if (chatbox.Textboxes[index].Choice[CurrentTextIndex].ShowOnTextScrollFinish)
			{
				Options[0].GetComponent<Animator>().Play("GonerMenu_OptionFadeIn");
				Options[1].GetComponent<Animator>().Play("GonerMenu_OptionFadeIn");
				SoulIcon.GetComponent<Animator>().Play("GonerMenu_HeartFadeIn");
				HideChoicesUntilFinish = true;
			}
			else
			{
				Options[0].GetComponent<Animator>().Play("GonerMenu_OptionFadeIn");
				Options[1].GetComponent<Animator>().Play("GonerMenu_OptionFadeIn");
				SoulIcon.GetComponent<Animator>().Play("GonerMenu_HeartFadeIn");
				HideChoicesUntilFinish = false;
			}
			if (ChoiceNumber == 2)
			{
				if (chatbox.Textboxes[index].Character[CurrentTextIndex] != null && chatbox.Textboxes[index].Character[CurrentTextIndex].CharacterIcon != null)
				{
					Options[0].GetComponent<TextMeshProUGUI>().text = cHATBOXCHOICE.Choices[0];
					Options[1].GetComponent<TextMeshProUGUI>().text = cHATBOXCHOICE.Choices[1];
				}
				else
				{
					Options[0].GetComponent<TextMeshProUGUI>().text = cHATBOXCHOICE.Choices[0];
					Options[1].GetComponent<TextMeshProUGUI>().text = cHATBOXCHOICE.Choices[1];
				}
			}
		}
		else
		{
			Options[0].GetComponent<Animator>().Play("GonerMenu_OptionFadeOut");
			Options[1].GetComponent<Animator>().Play("GonerMenu_OptionFadeOut");
			SoulIcon.GetComponent<Animator>().Play("GonerMenu_HeartFadeOut");
		}
	}

	private void CleanupOptions()
	{
		Options[0].GetComponent<Animator>().Play("GonerMenu_OptionFadeOut");
		Options[1].GetComponent<Animator>().Play("GonerMenu_OptionFadeOut");
		SoulIcon.GetComponent<Animator>().Play("GonerMenu_HeartFadeOut");
		SoulIcon.GetComponent<Animator>().speed = 1f;
	}

	private void SetHeartCursorPOS()
	{
		HeartCursor.localPosition = new Vector2(Options[cursorpos].localPosition.x - 90f, Options[cursorpos].localPosition.y);
		SoulIcon.position = Vector3.Lerp(SoulIcon.position, HeartCursor.position, 12f * Time.deltaTime);
		for (int i = 0; i < Options.Length; i++)
		{
			if (i != cursorpos)
			{
				Options[i].GetComponent<TextMeshProUGUI>().fontSharedMaterial = NotHighlightedMaterial;
				Options[i].GetComponent<TextMeshProUGUI>().color = Color.white;
			}
			else
			{
				Options[i].GetComponent<TextMeshProUGUI>().fontSharedMaterial = HighlightedMaterial;
				Options[i].GetComponent<TextMeshProUGUI>().color = Color.yellow;
			}
		}
		if (ChoiceNumber < 0)
		{
			HeartCursor.localPosition = new Vector2(0f, 1500f);
		}
	}

	private void SetTextboxPosY(float PosY)
	{
		TextboxObject.localPosition = new Vector2(TextboxObject.localPosition.x, PosY);
	}

	public void RunText(CHATBOXTEXT Chatbox, int index, INT_Chat reciever, bool ResetCurrentTextIndex)
	{
		if (ResetCurrentTextIndex)
		{
			CurrentTextIndex = 0;
		}
		StopCoroutine("PlayText");
		CleanupOptions();
		ChatIsCurrentlyRunning = true;
		CurrentAdditionalTextIndex = index;
		TextUI.color = Color.white;
		if (Chatbox.Textboxes[index].Choice[CurrentTextIndex] != null)
		{
			SetupChoices(Chatbox, index);
		}
		else
		{
			ChoiceNumber = 0;
		}
		TextUI.enabled = true;
		TextUI.text = "";
		StoredAfterIndex = index;
		storedchatboxtext = Chatbox;
		cursorpos = 0;
		if (Chatbox.Textboxes[index].Character[CurrentTextIndex] != null && Chatbox.Textboxes[index].Character[CurrentTextIndex].CharacterFont != null)
		{
			TextUI.font = Chatbox.Textboxes[index].Character[CurrentTextIndex].CharacterFont;
			TextBulletpointUI.font = TextUI.font;
		}
		else
		{
			TextUI.font = DefaultFont;
			TextBulletpointUI.font = DefaultFont;
		}
		if (Chatbox.Textboxes[index].Character[CurrentTextIndex] != null && Chatbox.Textboxes[index].Character[CurrentTextIndex].CharacterFontSize != 0f)
		{
			TextUI.fontSize = Chatbox.Textboxes[index].Character[CurrentTextIndex].CharacterFontSize;
		}
		else
		{
			TextUI.fontSize = 64f;
		}
		StartCoroutine("PlayText");
	}

	public void EndText()
	{
		if (storedreciever != null)
		{
			storedreciever.FinishedText = true;
		}
		TextUI.enabled = false;
		StoredAfterIndex = 0;
		storedchatboxtext = null;
		CurrentText = "";
		TextBulletpointUI.text = "";
		PauseCounter = 0;
		cursorpos = 0;
		ChoiceNumber = 0;
		HeartCursor.gameObject.SetActive(value: false);
		SoulIcon.gameObject.SetActive(value: false);
		SetHeartCursorPOS();
		CurrentTextIndex = 0;
		CurrentlyInChoice = false;
		Options[0].localPosition = new Vector2(0f, 1500f);
		Options[1].localPosition = new Vector2(0f, 1500f);
		Options[2].localPosition = new Vector2(0f, 1500f);
		Options[3].localPosition = new Vector2(0f, 1500f);
		CurrentAdditionalTextIndex = 0;
		if (storedreciever != null)
		{
			StartCoroutine(storedreciever.DebounceInteract());
		}
		storedreciever = null;
		StopCoroutine("PlayText");
		ChatIsCurrentlyRunning = false;
	}

	private IEnumerator PlayText()
	{
		string StoredText = storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Text[CurrentTextIndex];
		TextUI.text = StoredText;
		if (storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Character[CurrentTextIndex] != null)
		{
			if (storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Character[CurrentTextIndex].GiveCharacterBulletpoint)
			{
				TextBulletpointUI.text = "*";
			}
			else
			{
				TextBulletpointUI.text = "";
			}
		}
		else
		{
			TextBulletpointUI.text = "*";
		}
		CurrentText = StoredText;
		TextUI.maxVisibleCharacters = 0;
		bool ForcedFinishText = false;
		int messageCharLength = StoredText.Length;
		char[] messageCharacters = StoredText.ToCharArray();
		if (storedchatboxtext.Textboxes[CurrentAdditionalTextIndex] != null && storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action.Length != 0 && storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action[CurrentTextIndex] != null && !storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action[CurrentTextIndex].RunActionOnChatEnd)
		{
			CHATBOXACTION cHATBOXACTION = storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action[CurrentTextIndex];
			if (cHATBOXACTION.PlaySound && cHATBOXACTION.PossibleSounds.Length != 0)
			{
				AudioClip clip = cHATBOXACTION.PossibleSounds[Random.Range(0, cHATBOXACTION.PossibleSounds.Length)];
				TextVoiceEmitter.PlayOneShot(clip);
			}
			GameObject gameObject = GameObject.Find(cHATBOXACTION.TargetComponentGameObjectName);
			if (cHATBOXACTION.RunComponentFunction && gameObject != null && cHATBOXACTION.FunctionName != null)
			{
				string targetComponentClassname = cHATBOXACTION.TargetComponentClassname;
				Component component = gameObject.GetComponent(targetComponentClassname);
				if (component != null)
				{
					if (component.GetType().GetMethod(cHATBOXACTION.FunctionName) != null)
					{
						component.GetType().GetMethod(cHATBOXACTION.FunctionName).Invoke(component, null);
					}
					else
					{
						MonoBehaviour.print("did you forget to make the method public?");
					}
				}
				else
				{
					MonoBehaviour.print("Couldn't find Component named: " + targetComponentClassname);
				}
			}
		}
		while (TextUI.maxVisibleCharacters < messageCharLength)
		{
			if (messageCharacters[TextUI.maxVisibleCharacters].ToString() == " ")
			{
				TextUI.maxVisibleCharacters++;
				yield return new WaitForSeconds(0.08f * CurrentTextSpeedMultiplier);
			}
			else if (messageCharacters[TextUI.maxVisibleCharacters].ToString() == "(")
			{
				TextUI.maxVisibleCharacters++;
				yield return new WaitForSeconds(0.08f * CurrentTextSpeedMultiplier);
			}
			else if (messageCharacters[TextUI.maxVisibleCharacters].ToString() == ")")
			{
				TextUI.maxVisibleCharacters++;
				yield return new WaitForSeconds(0.08f * CurrentTextSpeedMultiplier);
			}
			else if (StoredText[TextUI.maxVisibleCharacters].ToString() == "@")
			{
				StoredText = RemoveSelectedCharacter(StoredText, TextUI.maxVisibleCharacters);
				TextUI.text = StoredText;
				CurrentText = StoredText;
				messageCharLength = StoredText.Length;
				yield return new WaitForSeconds(0.125f * CurrentTextSpeedMultiplier);
			}
			else if (StoredText[TextUI.maxVisibleCharacters].ToString() == "#")
			{
				StoredText = RemoveSelectedCharacter(StoredText, TextUI.maxVisibleCharacters);
				TextUI.text = StoredText;
				CurrentText = StoredText;
				messageCharLength = StoredText.Length;
				yield return new WaitForSeconds(0.8f * CurrentTextSpeedMultiplier);
			}
			else if (StoredText[TextUI.maxVisibleCharacters].ToString() == ";")
			{
				StoredText = RemoveSelectedCharacter(StoredText, TextUI.maxVisibleCharacters);
				StoredText = AddSelectedCharacter(StoredText, TextUI.maxVisibleCharacters, "\n");
				TextUI.text = StoredText;
				CurrentText = StoredText;
				messageCharLength = StoredText.Length;
				if (storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Character[CurrentTextIndex] != null)
				{
					if (storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Character[CurrentTextIndex].GiveCharacterBulletpoint)
					{
						TextBulletpointUI.text += "\n*";
					}
					else
					{
						TextBulletpointUI.text += "\n";
					}
				}
				else
				{
					TextBulletpointUI.text += "\n*";
				}
				TextUI.maxVisibleCharacters++;
				yield return new WaitForSeconds(0.8f * CurrentTextSpeedMultiplier);
			}
			else if (StoredText[TextUI.maxVisibleCharacters].ToString() == "~")
			{
				StoredText = RemoveSelectedCharacter(StoredText, TextUI.maxVisibleCharacters);
				StoredText = AddSelectedCharacter(StoredText, TextUI.maxVisibleCharacters, "\n");
				TextUI.text = StoredText;
				CurrentText = StoredText;
				messageCharLength = StoredText.Length;
				if (storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Character[CurrentTextIndex] != null)
				{
					if (storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Character[CurrentTextIndex].GiveCharacterBulletpoint)
					{
						TextBulletpointUI.text += "\n\n*";
					}
					else
					{
						TextBulletpointUI.text += "\n";
					}
				}
				else
				{
					TextBulletpointUI.text += "\n\n*";
				}
				TextUI.maxVisibleCharacters++;
				yield return new WaitForSeconds(0.8f * CurrentTextSpeedMultiplier);
			}
			else if (StoredText[TextUI.maxVisibleCharacters].ToString() == ",")
			{
				TextUI.maxVisibleCharacters++;
				yield return new WaitForSeconds(0.2f * CurrentTextSpeedMultiplier);
			}
			else if (StoredText[TextUI.maxVisibleCharacters].ToString() == ".")
			{
				TextUI.maxVisibleCharacters++;
				yield return new WaitForSeconds(0.08f * CurrentTextSpeedMultiplier);
			}
			else if (StoredText[TextUI.maxVisibleCharacters].ToString() == "<")
			{
				TextUI.maxVisibleCharacters++;
			}
			else if (StoredText[TextUI.maxVisibleCharacters].ToString() == ">")
			{
				TextUI.maxVisibleCharacters++;
			}
			else if (StoredText[TextUI.maxVisibleCharacters].ToString() == "£")
			{
				StoredText = RemoveSelectedCharacter(StoredText, TextUI.maxVisibleCharacters);
				TextUI.text = StoredText;
				CurrentText = StoredText;
				messageCharLength = StoredText.Length;
				ForcedFinishText = true;
			}
			else if (!ForcedFinishText)
			{
				TextUI.maxVisibleCharacters++;
				yield return new WaitForSeconds(0.08f * CurrentTextSpeedMultiplier);
			}
			else
			{
				TextUI.maxVisibleCharacters++;
			}
		}
		if (CurrentTextSpeedMultiplier == 0.85f)
		{
			yield return new WaitForSeconds(2f);
		}
		else
		{
			yield return new WaitForSeconds(0.5f);
		}
		if (TextUI.maxVisibleCharacters == PauseCounter && storedchatboxtext != null && !CurrentlyInChoice)
		{
			if (storedchatboxtext.Textboxes[CurrentAdditionalTextIndex] != null && storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action.Length != 0 && storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action[CurrentTextIndex] != null && storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action[CurrentTextIndex].RunActionOnChatEnd)
			{
				CHATBOXACTION cHATBOXACTION2 = storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action[CurrentTextIndex];
				if (cHATBOXACTION2.PlaySound && cHATBOXACTION2.PossibleSounds.Length != 0)
				{
					AudioClip clip2 = cHATBOXACTION2.PossibleSounds[Random.Range(0, cHATBOXACTION2.PossibleSounds.Length)];
					TextVoiceEmitter.PlayOneShot(clip2);
				}
				GameObject gameObject2 = GameObject.Find(cHATBOXACTION2.TargetComponentGameObjectName);
				if (cHATBOXACTION2.RunComponentFunction && gameObject2 != null && cHATBOXACTION2.FunctionName != null)
				{
					string targetComponentClassname2 = cHATBOXACTION2.TargetComponentClassname;
					Component component2 = gameObject2.GetComponent(targetComponentClassname2);
					if (component2 != null)
					{
						if (component2.GetType().GetMethod(cHATBOXACTION2.FunctionName) != null)
						{
							component2.GetType().GetMethod(cHATBOXACTION2.FunctionName).Invoke(component2, null);
						}
						else
						{
							MonoBehaviour.print("did you forget to make the method public?");
						}
					}
					else
					{
						MonoBehaviour.print("Couldn't find Component named: " + targetComponentClassname2);
					}
				}
			}
			CurrentTextIndex++;
			RunText(storedchatboxtext, StoredAfterIndex, storedreciever, ResetCurrentTextIndex: false);
		}
		else
		{
			if (TextUI.maxVisibleCharacters != PauseCounter || CurrentlyInChoice)
			{
				yield break;
			}
			if (storedchatboxtext != null && storedchatboxtext.Textboxes[CurrentAdditionalTextIndex] != null && storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action.Length != 0 && storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action[CurrentTextIndex] != null && storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action[CurrentTextIndex].RunActionOnChatEnd)
			{
				CHATBOXACTION cHATBOXACTION3 = storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Action[CurrentTextIndex];
				if (cHATBOXACTION3.PlaySound && cHATBOXACTION3.PossibleSounds.Length != 0)
				{
					AudioClip clip3 = cHATBOXACTION3.PossibleSounds[Random.Range(0, cHATBOXACTION3.PossibleSounds.Length)];
					TextVoiceEmitter.PlayOneShot(clip3);
				}
				GameObject gameObject3 = GameObject.Find(cHATBOXACTION3.TargetComponentGameObjectName);
				if (cHATBOXACTION3.RunComponentFunction && gameObject3 != null && cHATBOXACTION3.FunctionName != null)
				{
					string targetComponentClassname3 = cHATBOXACTION3.TargetComponentClassname;
					Component component3 = gameObject3.GetComponent(targetComponentClassname3);
					if (component3 != null)
					{
						if (component3.GetType().GetMethod(cHATBOXACTION3.FunctionName) != null)
						{
							component3.GetType().GetMethod(cHATBOXACTION3.FunctionName).Invoke(component3, null);
						}
						else
						{
							MonoBehaviour.print("did you forget to make the method public?");
						}
					}
					else
					{
						MonoBehaviour.print("Couldn't find Component named: " + targetComponentClassname3);
					}
				}
			}
			EndText();
		}
	}

	private string RemoveSelectedCharacter(string text, int Index)
	{
		return text.Remove(Index, 1);
	}

	private string AddSelectedCharacter(string text, int Index, string Insert)
	{
		return text.Insert(Index, Insert);
	}

	public int CountOfStringInText(string TargetText, char Counter)
	{
		int num = 0;
		bool flag = false;
		char[] array = TargetText.ToCharArray();
		for (int i = 0; i < array.Length; i++)
		{
			if (array[i] == Counter)
			{
				flag = true;
			}
			else if (false)
			{
				num++;
			}
		}
		return num;
	}

	private IEnumerator PlayTextBackup()
	{
		string StoredText = storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Text[CurrentTextIndex];
		TextUI.text = "* ";
		string currentText = CurrentText;
		for (int i = 0; i < currentText.Length; i++)
		{
			char c = currentText[i];
			if (storedchatboxtext.Textboxes[CurrentAdditionalTextIndex].Text[CurrentTextIndex] == StoredText)
			{
				if (c.ToString() == "#")
				{
					yield return new WaitForSeconds(0.5f);
				}
				else if (c.ToString() == "@")
				{
					yield return new WaitForSeconds(0.125f);
				}
				else if (c.ToString() == ",")
				{
					TextUI.text += c;
					yield return new WaitForSeconds(0.2f);
				}
				else if (c.ToString() == ".")
				{
					TextUI.text += c;
					yield return new WaitForSeconds(0.02f);
				}
				else if (c.ToString() == "?")
				{
					TextUI.text += c;
					yield return new WaitForSeconds(0.02f);
				}
				else if (c.ToString() == "!")
				{
					TextUI.text += c;
					yield return new WaitForSeconds(0.02f);
				}
				else if (c.ToString() == " ")
				{
					TextUI.text += c;
					yield return new WaitForSeconds(0.02f);
				}
				else
				{
					TextUI.text += c;
					TextVoiceEmitter.PlayOneShot(TextVoiceEmitter.clip);
					yield return new WaitForSeconds(0.02f);
				}
			}
		}
	}
}
